package com.xzy.seckill.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xzy.seckill.common.exception.Assert;
import com.xzy.seckill.common.result.ResponseEnum;
import com.xzy.seckill.mapper.UserMapper;
import com.xzy.seckill.pojo.dto.LoginDTO;
import com.xzy.seckill.pojo.dto.RegisterDTO;
import com.xzy.seckill.pojo.entity.User;
import com.xzy.seckill.pojo.vo.LoginVO;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xzy.seckill.service.UserService;
import com.xzy.seckill.utils.JwtUtils;
import com.xzy.seckill.utils.MD5Utils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.UUID;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xzy
 * @since 2022-01-24
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Override
    public LoginVO login(LoginDTO loginDTO) {




        //重复性校验在注册中进行 此处默认数据库中无重复


        //用户存在校验
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("phone",loginDTO.getPhone());
        User tUser = baseMapper.selectOne(wrapper);
        Assert.notNull(tUser,ResponseEnum.NOT_EXIST);

        //密码校验
        Assert.equals(tUser.getPassword(), MD5Utils.encrypt(loginDTO.getPassword(),tUser.getSalt()), ResponseEnum.PASSWORD_ERROR);


        //数据封装
        LoginVO loginVO = new LoginVO();
        BeanUtils.copyProperties(tUser,loginVO);

        //单点登录方式1：直接将id，用户名等信息存入token
        loginVO.setToken(JwtUtils.createToken(tUser.getId(),tUser.getNickname()));
        /*
          方式2，登录成功后，将用户信息保存到redis中，使用一个uuid作为key的部分，将这个uuid封装入jwt中返回前端
                   后期验证此uuid能否获取到用户用以判断是否登录，同时还可以相对安全的获取用户数据
                  相当于校验了两次
                  但这是否又违背了jwt无状态的原则，这相当于自己去实现了一套cookie+session？？？
         */


        //登录更新  后期可能改用触发器？？
        tUser.setLastLoginDate(LocalDateTime.now());
        tUser.setLoginCount(tUser.getLoginCount()+1);
        baseMapper.updateById(tUser);


        return loginVO;

    }


    @Override
    public void register(RegisterDTO registerDTO) {

        //重复性校验
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("phone",registerDTO.getPhone());
        Assert.isTrue(baseMapper.selectCount(wrapper)==0,ResponseEnum.PHONE_REPEAT);

        //盐值生成
        String salt = UUID.randomUUID().toString().substring(0, 10);


        //数据封装
        User tUser = new User();
        BeanUtils.copyProperties(registerDTO,tUser);
        tUser.setSalt(salt);
        tUser.setPassword(MD5Utils.encrypt(registerDTO.getPassword(),salt));
        tUser.setRegisterDate(LocalDateTime.now());
        tUser.setHead("https://xzy-srb.oss-cn-beijing.aliyuncs.com/QQ%E5%9B%BE%E7%89%8720211021003137.jpg");
        tUser.setLoginCount(0);


        //数据插入
        baseMapper.insert(tUser);





    }
}
